package org.jmpo;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * Если наш объект, который мы хотели создать для теста, сохраняет 
 * состояние, то его не получится создать один раз и потом протестировать
 * в нескольких различных методах, так как от теста к тесту его состояние
 * будет менятся. В этом случае нам нужно создавать объект перед каждым
 * тестом. Для этого удобно вынести создание объекта в отдельный метод, 
 * который будет вызываться перед каждым тестом. 
 * Если мы проаннотируем метод @BeforeEach, то jUnit сделает это за нас.
 * Важно, чтобы этот метод не был статическим! jUnit пытается вызвать его 
 * на создам объекте тестирующего класса.
 */
public class StudentBuilderTest {
    private Student.Builder builder;

    @BeforeEach
    public void newBuilder() {
        this.builder = new Student.Builder();
    }

    @Test
    public void defaultStudentBuilderTest() {
        Student expected = new Student(0, "");
        Student actual = builder.build();

        assertEquals(expected, actual);
    }

    @Test
    public void nameStudentBuilderTest() {
        final String name = "Alen";
        Student expected = new Student(0, name);
        Student actual = builder.withName(name).build();

        assertEquals(expected, actual);
    }

    @Test
    public void idStudentBuilderTest() {
        final long id = 100;
        Student expected = new Student(id, "");
        Student actual = builder.withId(id).build();

        assertEquals(expected, actual);
    }
    
    @Test
    public void idAndNameStudentBuilderTest() {
        final long id = 100;
        final String name = "Alen";
        Student expected = new Student(id, name);
        Student actual = builder.withId(id).withName(name).build();

        assertEquals(expected, actual);
    }

    @Test
    public void nameAndidStudentBuilderTest() {
        final String name = "Alen";
        final long id = 100;
        Student expected = new Student(id, name);
        Student actual = builder.withName(name).withId(id).build();

        assertEquals(expected, actual);
    }
}
